#!perl -w
# +-------------------------------------------------------------------------+
# | Джентльменский набор Web-разработчика                                   |
# | Версия: Денвер-3 2008-01-13                                             |
# +-------------------------------------------------------------------------+
# | Copyright (C) 2001-2007 Дмитрий Котеров.                                |
# +-------------------------------------------------------------------------+
# | Данный файл является частью комплекса программ "Денвер-3". Вы не можете |
# | использовать  его в коммерческих  целях.  Никакие другие ограничения не |
# | накладываются.  Если вы хотите внести изменения в исходный код,  авторы |
# | будут рады получить от вас комментарии и замечания. Приятной работы!    |
# +-------------------------------------------------------------------------+
# | Домашняя страница: http://denwer.ru                                     |
# | Контакты: http://forum.dklab.ru/denwer                                  |
# +-------------------------------------------------------------------------+

package Starters::Apache;
BEGIN { unshift @INC, "../lib"; }

use Tools;
use Installer;
use ParseHosts;
use VhostTemplate;
use StartManager;

# Seconds to wait apache stop while restart is active.
my $timeout = 10;

# Get common pathes.
my $basedir     = $CNF{apache_dir};
my $exe         = fsgrep { /\Q$CNF{apache_exe}\E/i } $basedir;
die "  Could not find $CNF{apache_exe} inside $basedir\n" if !$exe;
my $httpd_conf  = "$basedir/conf/httpd.conf";
my $vhosts_conf = "$basedir/conf/vhosts.conf";
my $httpd_pid   = "$basedir/logs/httpd.pid";


# Additional PATH entries.
my @addPath = ();

# Autoconfigure PHP - detect basedir from LoadModule in httpd.conf file.
my $phpdir = undef;
my $httpdCont = readBinFile($httpd_conf) or die "  Could not read $httpd_conf\n";
if ($httpdCont =~ /^[ \t]* LoadModule [ \t]+ php\S*_module [ \t]+ (?: "([^"\r\n]*)" | (\S+) )/mix) {
  my $path = dirname($1 || $2);
  if (my $p1 = dirgrep { /^php.ts\.dll$/i } $path) {
    $phpdir = dirname($p1);
  } elsif (my $p2 = dirgrep { /^php.ts\.dll$/i } "$path/..") {
    $phpdir = dirname($p2);
  }
}
if ($phpdir) {
  # PHP configuration file location.
  $ENV{PHPRC} = $phpdir;
  # For OpenSSL module in PHP.
  if (my $p = fsgrep { /^openssl.cnf$/i } $phpdir) {
    $ENV{OPENSSL_CONF} = $p;
  }
  # Set PATH.
  push @addPath, ($phpdir, fsgrep { /^extensions$/i || /^dlls$/i } $phpdir);
}


StartManager::action 
  $ARGV[0],
  PATH => [
  	'\usr\local\ImageMagick',
  	@addPath,
  ],
  start => sub {
    ###
    ### START.
    ###
    processVHosts();
    print "‡ ЇгбЄ Ґ¬ Apache...\n";
    if(checkApacheIfRunning()) {
      print "  Apache г¦Ґ § ЇгйҐ­.\n";
    } else {
      chdir($basedir);
      my $exe = $exe;
      if(!-f $exe) {
        die "  ЌҐ г¤ Ґвбп ­ ©вЁ $exe.\n";
      } else {
        # Clean global error.log to avoid stupid PHP "C:\mysql" binding.
        unlink("$basedir/logs/error.log");
        # Start apache.
        system("start $exe -w");
        print "  ѓ®в®ў®.\n";
      }
    }
  },
  stop => sub {
    ###
    ### STOP.
    ###
    print "‡ ўҐаи Ґ¬ а Ў®вг Apache...\n";
    my $exe = $exe;
    if(!-f $exe) {
      print "  ЌҐ г¤ Ґвбп ­ ©вЁ $exe.\n";
    } else {
      my $was = checkApacheIfRunning();
      # ’гЇ®© Apache2 ­Ґ г¬ҐҐв § ўҐаи вмбп Ї® -k shutdown!
      # Џ®нв®¬г ЇаЁе®¤Ёвбп ЇаЁЎЁў вм ўагз­го. ѓап§­®, Є®­Ґз­®.
      # Љбв вЁ, Parent ID г Їа®жҐбб  ­Ґ«м§п Ї®«гзЁвм ў Windows NT Workststion.
      my $ps = getPs(1);
      if ($ps) {
        foreach (@$ps) {
          next if $_->{exe} !~ /\b(apache|httpd)\.exe$/is;
          kill 9, $_->{pid};
        }
      } else {
        print "  ЌҐ г¤ Ґвбп ­ ©вЁ гвЁ«Ёвг ps.exe.\n";
      }
#      system("\"$exe\" -k shutdown");
      if($was) {
        unlink($httpd_pid);     
        print "  ѓ®в®ў®.\n";
      } else {
        print "  Apache ­Ґ § ЇгйҐ­.\n";
      }
    }
  },
  _middle => sub {
    my $tm = time();
    if(checkApacheIfRunning()) {
      print "Ћ¦Ё¤ Ґ¬ § ўҐаиҐ­Ёп Apache (¬ ЄбЁ¬г¬ $timeout бҐЄг­¤) ";
      while(time() - $tm < $timeout) {
        print ". ";
        if(!checkApacheIfRunning()) {
          print "\n";
          return;
        }
        sleep(1);
      }
      print "\n";
      print "  ЌҐ г¤ Ґвбп ¤®¦¤ вмбп § ўҐаиҐ­Ёп!\n";
    }
  },
;


sub processVHosts {
  my $VHOSTS = $vhosts_conf;
  my $HTTPD = $httpd_conf;

  print "‘®§¤ Ґ¬ Ў«®ЄЁ ўЁавг «м­ле е®бв®ў...\n";

  if(!-e $HTTPD) {
    die "  ЌҐ г¤ Ґвбп ­ ©вЁ $HTTPD\n";
  }

  # Add comments.
  my $vhosts = '';
  $vhosts .= clean qq{
    #
    # ВНИМАНИЕ!
    #
    # Данный файл был сгенерирован автоматически. Любые изменения, внесенные в 
    # него, потеряются после перезапуска комплекса. Если вы хотите изменить
    # параметры какого-то отдельного хоста, вам необходимо перенести 
    # соответствующий блок <VirtualHost> в httpd.conf (там написано, куда именно).
    #
    # Пожалуйста, не изменяйте этот файл.
    #
  };

  # Read Vhost template
  my $num = 1;
  foreach my $host (VhostTemplate::getAllVHosts($HTTPD)) {
#    use Data::Dumper; print Dumper($host);
    $vhosts .= "\n\n# Host ".$host->{path}." ($num): \n";

    my $s = $host->{vhost};
    # Delete comments.
    $s=~s/#.*//mg if $num!=1;
    $s=~s/^[ \t]*[\r\n]+//mg;    # delete empty lines

    # ‚бв ў«пҐ¬ ЎгЄўг ¤ЁбЄ  - Їа®Є«пвлҐ а §а Ў®взЁЄЁ PHP ЎҐ§ нв®Ј® ­Ґ ¬®Јгв ­ЁЄ Є!
    $s=~s{^(\s* DocumentRoot \s+ "?)(/)}{$1 . Installer::getSubstDriveConfig() . $2}mgxie;

    $vhosts .= $s;
  } continue {
    $num++;
  }

  # Remove duplicate Listen directives.
  my %dup = ();
  $vhosts =~ s{^\s* Listen \s+ "? ([^\s"]+) "?}{ ($dup{lc $1}++)? '#'.$& : $& }megx;

  # Remove duplicate NameVirtualHost.
  %dup = ();
  $vhosts =~ s{^\s* NameVirtualHost \s+ "? ([^\s"]+) "?}{ ($dup{lc $1}++)? '#'.$& : $& }megx;
  
  # Open output file.
  if(!open(local *F, ">$VHOSTS")) {
    out qq{
      ‚Ќ€ЊЂЌ€…!
      ЌҐ г¤ Ґвбп ®вЄалвм д ©« $VHOSTS ­  § ЇЁбм. 
      Џа®¤®«¦Ґ­ЁҐ а Ў®вл ­Ґў®§¬®¦­®.
    };
    waitEnter();
    die "\n";
  }
  print F $vhosts;
  close F;
  
  print "  „®Ў ў«Ґ­® е®бв®ў: ".($num-1)."\n";
}

sub checkApacheIfRunning {
  return !open(local *F, ">>$exe");
}

return 1 if caller;
